home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / 2m30src.zip / 2M.ASM < prev    next >
Assembly Source File  |  1995-03-06  |  51KB  |  1,224 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▄  ▒▒▒▒▄      ▒▒▒▒▄                                │
  5. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█  ▒▒▒▒▒▄    ▒▒▒▒▒█                                │
  6. ;│  ▀▀▀▀▀▀▀▀▀▀▒▒▒▒█  ▒▒▒▒▒▒▄  ▒▒▒▒▒▒█                                │
  7. ;│            ▒▒▒▒█  ▒▒▒▒▒▒▒▄▒▒▒▒▒▒▒█                                │
  8. ;│            ▒▒▒▒█  ▒▒▒▒█▒▒▒▒▒█▒▒▒▒█                                │
  9. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█  ▒▒▒▒█ ▒▒▒█▀▒▒▒▒█    ▒▒▒▒▒▒▒▒▒▒▄       ▒▒▒▒▒▒▄   │
  10. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█  ▒▒▒▒█  ▒█▀ ▒▒▒▒█     ▀▀▀▀▀▀▀▒▒█     ▒▒▒▒█▀▀▀▒▒▄ │
  11. ;│ ▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀  ▒▒▒▒█   ▀  ▒▒▒▒█            ▒▒█     ▒▒█▀▒▒▄ ▒▒█ │
  12. ;│ ▒▒▒▒█             ▒▒▒▒█      ▒▒▒▒█      ▒▒▒▒▒▒▒▒█     ▒▒█ ▒▒█ ▒▒█ │
  13. ;│ ▒▒▒▒█             ▒▒▒▒█      ▒▒▒▒█       ▀▀▀▀▀▒▒█     ▒▒█ ▒▒█ ▒▒█ │
  14. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▄  ▒▒▒▒█      ▒▒▒▒█            ▒▒█     ▒▒█  ▀▒▒▒▒█ │
  15. ;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█  ▒▒▒▒█      ▒▒▒▒█    ▒▒▒▒▒▒▒▒▒▒█ ▒▒▄  ▀▒▒▒▒▒▒█▀▀ │
  16. ;│  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   ▀▀▀▀       ▀▀▀▀     ▀▀▀▀▀▀▀▀▀▀  ▀▀    ▀▀▀▀▀▀   │
  17. ;│                                                                   │
  18. ;│        2M 3.0  -  (C) 1993-1995  Ciriaco García de Celis.         │
  19. ;│                                                                   │
  20. ;│      SOPORTE PARA DISQUETES CON MAYOR CAPACIDAD DE LA NORMAL      │
  21. ;│                    CREADOS POR LA UTILIDAD 2MF                    │
  22. ;│                                                                   │
  23. ;│ - Para PC, XT o AT con controladora y unidades de alta.           │
  24. ;│ - Programación directa del controlador de disquetes y del DMA.    │
  25. ;│ - Soporte para sectores de más de 512 bytes (economizar GAPs).    │
  26. ;│ - Mezcla de sectores de distinto tamaño en la misma pista.        │
  27. ;│ - Ruptura del límite habitual de 80 pistas (incluido 360K).       │
  28. ;│ - Emulación de sectores de 512 bytes en INT 13h.                  │
  29. ;│ - Función 5 (INT 13h) reforzada para formatear los nuevos discos. │
  30. ;│ - El soporte residente opera eficazmente bajo DOS y WINDOWS 3.X   │
  31. ;│                                                                   │
  32. ;│      Para la versión AT:        Para la versión PC/XT:            │
  33. ;│        TASM  2m /m5               TASM  2m, 2mx /m5 /dXT          │
  34. ;│        TLINK 2m /t                TLINK 2mx /t                    │
  35. ;│                                                                   │
  36. ;└───────────────────────────────────────────────────────────────────┘
  37.  
  38.               IFDEF XT
  39.                XTX EQU ,"X",
  40.               ELSE
  41.                .286                    ; versión para AT o superior
  42.                XTX EQU ,
  43.               ENDIF
  44.  
  45. ON             EQU   1                 ; constantes booleanas
  46. OFF            EQU   0
  47.  
  48. ; ------------ Macros de propósito general.
  49.  
  50. XPUSH          MACRO regmem            ; apilar lista de registros
  51.                  IRP rm, <regmem>
  52.                    PUSH rm
  53.                  ENDM
  54.                ENDM
  55.  
  56. XPOP           MACRO regmem            ; desapilar lista de registros
  57.                  IRP rm, <regmem>
  58.                    POP rm
  59.                  ENDM
  60.                ENDM
  61.  
  62.               IFNDEF XT
  63.  
  64. XPUSHA         MACRO
  65.                  PUSHA
  66.                ENDM
  67.  
  68. XPOPA          MACRO
  69.                  POPA
  70.                ENDM
  71.  
  72. XSHL           MACRO regmem, cuenta
  73.                  SHL regmem,cuenta
  74.                ENDM
  75.  
  76. DELAY          MACRO                   ; estados de espera
  77.                  JMP SHORT $+2         ; para AT obsoleto
  78.                  JMP SHORT $+2
  79.                ENDM
  80.  
  81. DDS            MACRO
  82.                PUSH  40h
  83.                POP   DS
  84.                ENDM
  85.  
  86. DES            MACRO
  87.                PUSH  40h
  88.                POP   ES
  89.                ENDM
  90.  
  91. PMICRO         MACRO                   ; retardo de aprox. 15,09 µs
  92.                LOCAL pmicro_iter       ; (exactamente 18/1193180 sg.)
  93. pmicro_iter:   DELAY
  94.                IN    AL,61h            ; Esta macro puede ejecutarse
  95.                AND   AL,10h            ; repetitivamente (se apoya en
  96.                CMP   AL,AH             ; AX) para hacer retardos a
  97.                JE    pmicro_iter       ; través de la temporización
  98.                MOV   AH,AL             ; del refresco de la memoria
  99.                ENDM                    ; dinámica de los AT.
  100.  
  101.               ELSE
  102.  
  103. XPUSHA         MACRO
  104.                  XPUSH <AX, BX, CX, DX, SI, DI>
  105.                ENDM
  106.  
  107. XPOPA          MACRO
  108.                  XPOP  <DI, SI, DX, CX, BX, AX>
  109.                ENDM
  110.  
  111. XSHL           MACRO regmem, cuenta
  112.                  REPT cuenta
  113.                    SHL regmem,1
  114.                  ENDM
  115.                ENDM
  116.  
  117. DELAY          MACRO                   ; sin estados de espera
  118.                ENDM
  119.  
  120. DDS            MACRO
  121.                PUSH  AX
  122.                MOV   AX,40h
  123.                MOV   DS,AX
  124.                POP   AX
  125.                ENDM
  126.  
  127. DES            MACRO
  128.                PUSH  AX
  129.                MOV   AX,40h
  130.                MOV   ES,AX
  131.                POP   AX
  132.                ENDM
  133.  
  134.               ENDIF
  135.  
  136. ; ------------ Programa.
  137.  
  138. _PRINCIPAL     SEGMENT
  139.                ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
  140.  
  141.                ORG   100h
  142.  
  143. ini_residente  EQU   $
  144.  
  145. ; ****************************************
  146. ; *                                      *
  147. ; *   D A T O S    R E S I D E N T E S   *
  148. ; *                                      *
  149. ; ****************************************
  150.  
  151. inicio:        JMP   main
  152.  
  153. ; ------------ Identificación estandarizada del programa.
  154.  
  155. program_id     LABEL BYTE
  156. segmento_real  DW    0   ; segmento real donde será cargado
  157. offset_real    DW    0   ; offset real     "     "     "
  158. longitud_total DW    0   ; zona de memoria ocupada (párrafos)
  159. info_extra     DB    80h ; bits 0, 1 y 2-> 000: normal, con PSP
  160.                          ;                 001: bloque UMB XMS
  161.                          ;                 010: *.SYS
  162.                          ;                 011: *.SYS formato EXE
  163.                          ; bit 7 a 1: «extension_id» definida
  164. multiplex_id   DB    0   ; número Multiplex de este TSR
  165. vectores_id    DW    tabla_vectores
  166. extension_id   DW    tabla_extra
  167.                DB    "*##*"
  168. autor_nom_ver  DB    "CiriSOFT:2M" XTX ":3.0",0
  169.                DB    2  ; número de vectores de interrupción usados
  170. tabla_vectores EQU   $
  171. vieja_i13      DB    13h           ; INT 13h
  172. ant_int13      LABEL DWORD         ; dirección original
  173. ant_int13_off  DW    0
  174. ant_int13_seg  DW    0
  175.                DB    2Fh           ; INT 2Fh
  176. ant_int2F      LABEL DWORD         ; dirección original
  177. ant_int2F_off  DW    0
  178. ant_int2F_seg  DW    0
  179.  
  180. tabla_extra    LABEL BYTE
  181.                DW    ctrl_exterior ; permitido control exterior
  182.                DW    0             ; campo reservado
  183.  
  184. ctrl_exterior  LABEL BYTE
  185. reubicabilidad DB    1             ; programa 100% reubicable
  186. activacion     DW    act
  187. act            DB    1
  188.  
  189. ; ***********************************************
  190. ; *                                             *
  191. ; *   C O D I G O   Y   D A T O S   D E   2 M   *
  192. ; *                                             *
  193. ; ***********************************************
  194.  
  195.                INCLUDE 2MKERNEL.INC
  196.  
  197. fin_residente  EQU   $  ; fin del área residente sin contar el buffer
  198.  
  199. bytes_resid    EQU   fin_residente-ini_residente
  200.  
  201.  
  202. ; *****************************
  203. ; *                           *
  204. ; *   I N S T A L A C I O N   *
  205. ; *                           *
  206. ; *****************************
  207.  
  208. main           PROC
  209.                LEA   BP,parametros
  210.                MOV   BX,81h
  211.                CALL  obtener_param     ; analizar posibles parámetros
  212.                JNC   params_ok         ; son correctos
  213.                OR    error,ERRSINTAX
  214.                JMP   informar
  215. params_ok:     CMP   param_l,ON
  216.                JNE   ins_mem
  217.                JMP   informar
  218. ins_mem:       CALL  inic_general      ; inicializar ciertas variables
  219.                CALL  pc_ok?
  220.                TEST  error,MALPC or MALDOS or MALBIOS or MALDRV
  221.                JZ    proc_tsr
  222.                JMP   informar          ; no hay configuración correcta
  223. proc_tsr:      CMP   param_u,ON        ; ¿se solicita desinstalarlo?
  224.                JNE   cont_ins          ; no
  225.                CALL  residente?        ; sí: ¿está residente?
  226.                JNC   desinstalable
  227.                OR    error,NOINSTALADO ; programa aún no instalado
  228.                JMP   informar
  229. desinstalable: CALL  testWin
  230.                JNC   win_out_ok
  231.                OR    error,WIN_UNLOAD
  232.                JMP   informar          ; no desinstalar desde Windows
  233. win_out_ok:    OR    accion,DESINSTALADO
  234.                MOV   ES,tsr_seg
  235.                MOV   DI,tsr_off
  236.                TEST  BYTE PTR ES:[DI-10],2
  237.                JZ    no_sys
  238.                OR    error,INSTALADOSYS  ; no desinstalar versión SYS
  239.                JMP   informar
  240. no_sys:        CALL  hay2mdos?
  241.                JC    no_2mdos
  242.                OR    error,HAY2MDOSDES ; desinstalar antes 2MDOS
  243.                JMP   informar
  244. no_2mdos:      MOV   AH,ES:[DI-9]
  245.                CALL  mx_unload         ; desinstalarlo:
  246.                JC    err_ins           ; no ha sido posible
  247.               IFNDEF XT
  248.                MOV   AX,sbootseg
  249.                AND   AX,AX
  250.                JZ    sboot_d_ok        ; no hay copia SuperBOOT
  251.                MOV   ES,AX
  252.                MOV   BX,ES:[0]
  253.                MOV   ES:[BX].cambio,ON           ; simular cambio A:
  254.                MOV   BX,ES:[2]
  255.                MOV   ES:[BX].cambio,ON           ; simular cambio B:
  256.               ENDIF
  257. sboot_d_ok:    JMP   informar
  258. err_ins:       OR    error,IMPDESINS   ; no es posible
  259.                JMP   informar
  260. cont_ins:      CALL  residente?
  261.                JNC   ya_reside
  262.                CMP   AX,0              ; ¿reside una versión distinta?
  263.                JE    instalable
  264.                OR    error,NOINSTALABLE  ; versión incompatible
  265.                JMP   informar
  266. ya_reside:     OR    accion,YAINSTALADO
  267.               IFDEF  XT
  268.                CALL  adaptar_param     ; parámetros en copia residente
  269.               ENDIF
  270.                JMP   informar
  271. instalable:    CALL  hay2mdos?
  272.                JC    tw
  273.                OR    error,HAY2MDOSINS ; instalar antes que 2MDOS
  274.                JMP   informar
  275. tw:            CALL  testWin
  276.                JNC   win_in_ok
  277.                OR    error,WIN_LOAD
  278.                JMP   informar          ; no instalar desde Windows
  279. win_in_ok:     OR    accion,INSTALADO
  280.                CALL  instalar_tsr      ; instalar el TSR
  281.                JC    informar
  282.               IFNDEF XT
  283.                MOV   AX,sbootseg
  284.                AND   AX,AX
  285.                JZ    sboot_i_ok        ; no hay copia SuperBOOT
  286.                MOV   ES,AX
  287.                MOV   BX,ES:[0]
  288.                MOV   ES:[BX].control2m_flag,OFF  ; anularla control A:
  289.                MOV   BX,ES:[2]
  290.                MOV   ES:[BX].control2m_flag,OFF  ; anularla control B:
  291.               ENDIF
  292. sboot_i_ok:    MOV   ES,tsr_seg
  293. informar:      CALL  info
  294.                MOV   DX,mem640         ; tamaño zona residente
  295.                AND   DX,DX
  296.                JZ    fin_noresid
  297.                MOV   AX,3100h
  298.                INT   21h               ; terminar residente
  299. fin_noresid:   MOV   AX,4C00h
  300.                INT   21h               ; terminar no residente
  301. main           ENDP
  302.  
  303. instalar_tsr   PROC
  304.                CALL  mx_get_handle     ; obtener entrada Multiplex
  305.                JNC   handle_ok
  306.                OR    error,MX64FULL    ; no quedan entradas
  307.                STC
  308.                RET
  309. handle_ok:     MOV   multiplex_id,AH   ; entrada multiplex para 2M
  310.                CALL  preservar_ints    ; tomar nota de vectores
  311.                CMP   param_ml,ON       ; ¿se indicó parámetro /ML?
  312.                JE    instalar_ml       ; en efecto
  313.                MOV   AX,parrafos_resid ; área residente sin PSP
  314.                MOV   mem640,AX         ; copia de seguridad :)
  315.                CALL  UMB_alloc         ; pedir memoria superior XMS
  316.                JC    busca_upper       ; no hay la suficiente
  317.                LEA   BX,buffer_io-256  ; AX:BX dirección del buffer
  318.                CALL  testDMA
  319.                PUSH  AX
  320.                MOV   DX,AX
  321.                MOV   AH,12h
  322.                CALL  gestor_XMS        ; redimensionar bloque memoria
  323.                CMP   AX,1
  324.                JE    xms_redim_ok
  325.                MOV   AX,mem640
  326.                MOV   parrafos_resid,AX ; función no soportada
  327. xms_redim_ok:  POP   AX
  328.                CLC                     ; indicar que usa memoria XMS
  329.                JMP   instalar_umb
  330. busca_upper:   MOV   AX,parrafos_resid
  331.                CALL  UPPER_alloc       ; pedir memoria superior DOS 5
  332.                JC    instalar_ml       ; no hay la suficiente
  333.                LEA   BX,buffer_io-256  ; AX:BX dirección del buffer
  334.                CALL  testDMA
  335.                XPUSH <AX, ES>
  336.                MOV   ES,AX
  337.                MOV   AH,4Ah
  338.                INT   21h               ; redimensionar bloque memoria
  339.                CALL  upper_fork        ; dejar residente el bloque
  340.                XPOP  <ES, AX>
  341.                STC                     ; indicar que usa memoria DOS
  342. instalar_umb:  MOV   ES,AX             ; segmento del bloque UMB
  343.                MOV   DI,0              ; ES:0 zona a donde reubicar
  344.                MOV   mem640,DI         ; no terminar residente
  345.                JMP   instalar_asi
  346. instalar_ml:   ADD   parrafos_resid,6  ; respetar 96 bytes de PSP
  347.                MOV   AX,CS
  348.                LEA   BX,buffer_io-(256-96)
  349.                CALL  testDMA
  350.                MOV   mem640,BX         ; ocupar memoria convencional
  351.                STC
  352.                MOV   DI,96             ; instalación mem. convencional
  353.                CALL  free_environ      ; liberar espacio de entorno
  354.                STC                     ; no se usa XMS
  355. instalar_asi:  CALL  inicializa_id     ; inicializar identificación
  356.                MOV   CX,(bytes_resid+15)/16  ; sin contar el buffer
  357.                CALL  reubicar_prog     ; reubicar programa a ES:DI
  358.                CALL  activar_ints      ; interceptar vectores
  359.                CLC
  360.                RET
  361. instalar_tsr   ENDP
  362.  
  363. ;*********************************************************
  364. ;*                                                       *
  365. ;*  SUBRUTINAS DE PROPOSITO GENERAL PARA LA INSTALACION  *
  366. ;*                                                       *
  367. ;*********************************************************
  368.  
  369.                INCLUDE 2MUTIL.INC
  370.  
  371. ; ------------ Ya está instalada otra versión distinta del programa.
  372.  
  373. error_version  PROC
  374.                PUSH  ES
  375.                LEA   DX,mal_ver_txt1
  376.                CALL  print
  377.                LES   DI,tsr_dir
  378.                MOV   AL,':'
  379.                MOV   CL,255
  380.                CLD
  381.                REPNE SCASB
  382.                REPNE SCASB
  383.                MOV   DL,ES:[DI]        ; número de versión
  384.                MOV   AH,2
  385.                INT   21h
  386.                MOV   DL,'.'
  387.                MOV   AH,2
  388.                INT   21h
  389.                MOV   DL,ES:[DI+2]      ; revisión
  390.                MOV   AH,2
  391.                INT   21h
  392.                LEA   DX,mal_ver_txt2
  393.                CALL  print
  394.                POP   ES
  395.                RET
  396. error_version  ENDP
  397.  
  398. ; ------------ Inicializar ciertas variables. La memoria consumida
  399. ;              se calcula para el peor de los casos, cuando el buffer
  400. ;              residente ocupa incluso el doble debido al DMA.
  401.  
  402. inic_general   PROC
  403.                CALL  inic_XMS          ; detectar controlador XMS
  404.                MOV   AX,(bytes_resid+tbuffer*2+15)/16
  405.                MOV   parrafos_resid,AX ; memoria máxima necesaria
  406.               IFDEF  XT
  407.                CALL  testAT
  408.                JNC   skip_tmtest       ; en AT no calcularlo [*]
  409.                CALL  cte_tiempos
  410.                MOV   tbase,AX          ; cte. retardo para 1/18,2 seg.
  411. skip_tmtest:  ENDIF
  412.                MOV   DL,0
  413.                CALL  tipo_disco
  414.                JNC   hay_unidad
  415.                MOV   DL,1
  416.                CALL  tipo_disco
  417.                JNC   hay_unidad
  418.                OR    error,MALBIOS     ; no hay disqueteras
  419.                RET
  420. hay_unidad:    MOV   DL,0
  421.                CALL  tipo_disco
  422.                MOV   info_A.tipo_drv,BL  ; guardar tipo unidad A:
  423.                MOV   DL,1
  424.                CALL  tipo_disco
  425.                MOV   info_B.tipo_drv,BL  ; guardar tipo unidad B:
  426.                RET
  427. inic_general   ENDP
  428.  
  429. ; ------------ Inicializar área «program_id» del programa residente.
  430. ;              A la entrada, ES:DI = seg:off a donde será reubicado
  431. ;              y CF=0 si se utiliza memoria superior XMS.
  432.  
  433. inicializa_id  PROC
  434.                PUSHF
  435.                MOV   segmento_real,ES  ; anotar segmento del bloque
  436.                MOV   offset_real,DI    ; ídem con el offset
  437.                MOV   AX,parrafos_resid
  438.                MOV   longitud_total,AX
  439.                MOV   AL,1
  440.                POPF                    ; CF=0: usar memoria UMB XMS
  441.                JNC   info_ok
  442.                DEC   AL                ; usar memoria convencional
  443. info_ok:       OR    info_extra,AL
  444.                RET
  445. inicializa_id  ENDP
  446.  
  447. ; ------------ Devolver CF=0 si 2MDOS está instalado.
  448.  
  449. hay2mdos?      PROC
  450.                XPUSH <ES, DI>
  451.                LEA   SI,id_2mdos       ; identificación del programa
  452.                MOV   CX,id_2mdos_tam
  453.                MOV   AX,1492h
  454.                MOV   ES,AX
  455.                MOV   DI,1992h          ; ES:DI protocolo de búsqueda
  456.                CALL  mx_find_tsr       ; buscar si está en memoria
  457.                XPOP  <DI, ES>
  458.                RET
  459. hay2mdos?      ENDP
  460.  
  461. ; ------------ Adaptar parámetros de un 2MX ya instalado.
  462. ;              Sólo se actualiza la constante de retardo, por si el
  463. ;              turbo de la máquina fue conmutado.
  464.  
  465.               IFDEF  XT
  466.  
  467. adaptar_param  PROC
  468.                PUSH  ES
  469.                MOV   ES,tsr_seg
  470.                MOV   AX,tbase
  471.                MOV   ES:tbase,AX
  472.                POP   ES
  473.                RET
  474. adaptar_param  ENDP
  475.  
  476.               ENDIF
  477.  
  478. ; ------------ Informar al usuario.
  479.  
  480. info           PROC
  481.                CMP   param_ayuda,ON    ; ¿solicitud de ayuda?
  482.                JNE   info_p?
  483.                LEA   DX,ayuda_txt
  484.                CALL  print
  485.                JMP   fin_info
  486. info_p?:       CMP   param_l,ON
  487.                JNE   info_normal
  488.                LEA   DX,infop_txt
  489.                CALL  print
  490.                JMP   fin_info
  491. info_normal:   LEA   DX,programa_txt
  492.                CALL  print
  493.                TEST  error,0FFFFh
  494.                JZ    info_ins          ; no hay error
  495.                JMP   info_err          ; lo hay: informar del mismo
  496. info_ins:      LEA   DX,instalado_txt
  497.                TEST  accion,INSTALADO  ; ¿informar "instalado"?
  498.                JNZ   acc_ok
  499.                LEA   DX,ya_instal_txt
  500.                TEST  accion,YAINSTALADO  ; ¿informar "ya instalado"?
  501.                JNZ   acc_ok
  502.                LEA   DX,des_ok_txt     ; informar "desinstalado"
  503.                CALL  print
  504.                JMP   fin_info
  505. acc_ok:        CALL  print             ; instalado/ya instalado...
  506.                CALL  info_drvs
  507.                LEA   DX,dma_cross_txt
  508.                TEST  accion,BUFFERPLUS ; ¿el DMA cruzaba frontera?
  509.                JZ    dma_ok
  510.                CALL  print
  511. dma_ok:        JMP   fin_info
  512. info_err:      LEA   DX,mal_pc_txt
  513.                TEST  error,MALPC       ; ¿no es ordenador adecuado?
  514.                JZ    otroerr1
  515.                CALL  print
  516. otroerr1:      LEA   DX,mal_dos_txt
  517.                TEST  error,MALDOS      ; ¿DOS incorrecto?
  518.                JZ    otroerr21
  519.                CALL  print
  520. otroerr21:     LEA   DX,mal_bios_txt
  521.                TEST  error,MALBIOS     ; ¿BIOS obsoleta?
  522.                JZ    otroerr22
  523.                CALL  print
  524. otroerr22:     LEA   DX,mal_drv_txt
  525.                TEST  error,MALDRV      ; ¿Unidades de doble?
  526.                JZ    otroerr23
  527.                CALL  print
  528. otroerr23:     LEA   DX,err_sintax_txt
  529.                TEST  error,ERRSINTAX   ; ¿error de sintaxis?
  530.                JZ    otroerr3
  531.                CALL  print
  532. otroerr3:      LEA   DX,imp_desins_txt
  533.                TEST  error,NOINSTALADO ; no instalado, ¿piden
  534.                JZ    otroerr4          ; desinstalar?
  535.                CALL  print
  536. otroerr4:      LEA   DX,des_no_ok_txt
  537.                TEST  error,IMPDESINS   ; ¿imposible desinstalar?
  538.                JZ    otroerr5
  539.                CALL  print
  540. otroerr5:      LEA   DX,inst_sys_txt
  541.                TEST  error,INSTALADOSYS  ; ¿instalada versión *.SYS?
  542.                JZ    otroerr5x
  543.                CALL  print
  544. otroerr5x:     LEA   DX,inst_2mdos_txt
  545.                TEST  error,HAY2MDOSINS   ; ¿instalar antes que 2MDOS?
  546.                JZ    otroerr5y
  547.                CALL  print
  548. otroerr5y:     LEA   DX,dins_2mdos_txt
  549.                TEST  error,HAY2MDOSDES   ; ¿desinstalar antes 2MDOS?
  550.                JZ    otroerr5z
  551.                CALL  print
  552. otroerr5z:     TEST  error,NOINSTALABLE  ; ¿versión incorrecta?
  553.                JZ    otroerr6
  554.                CALL  error_version
  555. otroerr6:      LEA   DX,nocabe_txt
  556.                TEST  error,MX64FULL    ; ¿imposible instalar?
  557.                JZ    otroerr8
  558.                CALL  print
  559. otroerr8:      LEA   DX,win_ld_txt
  560.                TEST  error,WIN_LOAD    ; ¿instalar desde Windows?
  561.                JZ    otroerr9
  562.                CALL  print
  563. otroerr9:      LEA   DX,win_ul_txt
  564.                TEST  error,WIN_UNLOAD  ; ¿desinstalar desde Windows?
  565.                JZ    fin_info
  566.                CALL  print
  567. fin_info:      RET
  568. info           ENDP
  569.  
  570.                ; --- Informar de las unidades controladas por 2M.
  571.  
  572. info_drvs      PROC
  573.                MOV   DL,0
  574.                CALL  tipo_disco
  575.                CALL  pr_tipo
  576.                MOV   DL,1
  577.                CALL  tipo_disco
  578.                CALL  pr_tipo
  579.                LEA   DX,crlf_txt
  580.                CALL  print
  581.                RET
  582. info_drvs      ENDP
  583.  
  584.                ; --- Imprimir unidad y su tipo.
  585.  
  586. pr_tipo        PROC
  587.                CMP   BL,2
  588.                JE    tp_ok
  589.                CMP   BL,4
  590.                JE    tp_ok
  591.                CMP   BL,5
  592.                MOV   BL,5
  593.                JAE   tp_ok
  594.                RET
  595. tp_ok:         PUSH  BX
  596.                ADD   DL,'A'
  597.                MOV   AH,2
  598.                INT   21h
  599.                POP   BX
  600.                SUB   BL,2
  601.                MOV   BH,0
  602.                SHL   BX,1
  603.                ADD   BX,OFFSET tabla_ndrvs
  604.                MOV   DX,[BX]
  605.                CALL  print
  606.                RET
  607. pr_tipo        ENDP
  608.  
  609. ; ------------ Comprobar que la configuración es la adecuada. Para
  610. ;              saber si la INT 13h de este ordenador acaba llamando a
  611. ;              la INT 40h, se desvía la INT 40h y se provoca un inocuo
  612. ;              reset de disquetes vía INT 13h para comprobar si pasa
  613. ;              por la INT 40h. Si está cargado el código SuperBOOT, se
  614. ;              utiliza no obstante siempre la INT 13h (para anularlo
  615. ;              por completo).
  616.  
  617. pc_ok?         PROC
  618.               IFNDEF XT
  619.                CALL  SuperBOOT?
  620.                JNE   no_superboot
  621.                MOV   sbootseg,AX       ; segmento SuperBOOT
  622.                JMP   test_dos          ; es SuperBOOT: usar INT 13h
  623.               ENDIF
  624. no_superboot:  CALL  test_i40
  625.                TEST  accion,I40
  626.                JZ    test_dos          ; no soportada la INT 40h
  627.                MOV   nueva_i13,40h
  628.                MOV   vieja_i13,40h     ; usar INT 40 en vez de INT 13
  629. test_dos:      MOV   AH,30h
  630.                INT   21h
  631.                XCHG  AH,AL
  632.                CMP   AX,31Eh           ; ¿DOS 3.30 o superior?
  633.                MOV   AX,MALDOS
  634.                JB    pc_nok
  635.                CALL  testAT
  636.                MOV   AX,MALPC
  637.               IFNDEF XT
  638.                JC    pc_nok
  639.               ELSE
  640.                JNC   pc_nok            ; [*]
  641.               ENDIF
  642.                TEST  error,MALBIOS
  643.                JNZ   pc_ok             ; con ese error vale
  644.                MOV   AX,MALDRV
  645.                CMP   info_A.tipo_drv,2 ; ¿unidad A: de 1.2?
  646.                JE    pc_ok
  647.                CMP   info_A.tipo_drv,4 ; ¿unidad A: de 1.44 ó 2.88?
  648.                JAE   pc_ok
  649.                CMP   info_B.tipo_drv,2 ; ¿unidad B: de 1.2?
  650.                JE    pc_ok
  651.                CMP   info_B.tipo_drv,4 ; ¿unidad B: de 1.44 ó 2.88?
  652.                JAE   pc_ok
  653. pc_nok:        OR    error,AX
  654. pc_ok:         TEST  error,MALPC
  655.                JZ    pc_ok?_ret
  656.                AND   error,MALPC       ; ese error basta
  657. pc_ok?_ret:    RET
  658. pc_ok?         ENDP
  659.  
  660.                ; --- Devolver ZF=1 si 2M está instalado en SuperBOOT.
  661.                ;     La rutina funciona aunque QEMM modifique de modo
  662.                ;     temporal el límite de memoria a casi un mega en
  663.                ;     la llamada a INT 12h.
  664.  
  665.               IFNDEF XT
  666.  
  667. SuperBOOT?     PROC
  668.                PUSH  ES
  669.                INT   12h               ; tamaño memoria convencional
  670.                MOV   BX,640
  671.                CMP   AX,256
  672.                JB    base_sc_ok        ; dato extraño
  673.                CMP   AX,640
  674.                JA    base_sc_ok        ; dato extraño
  675.                MOV   BX,AX
  676. base_sc_ok:    MOV   AX,BX
  677.                ADD   AX,127            ; redondeo
  678.                MOV   CL,7
  679.                SHR   AX,CL
  680.                SHL   AX,CL             ; hacia frontera de 128K
  681.                MOV   CX,AX
  682.                SUB   CX,BX             ; buscar en área posible
  683.                DEC   AX
  684.                MOV   BX,64
  685.                MUL   BX                ; AX = segmento de SuperBOOT
  686.                CLD
  687. scan_boot:     MOV   ES,AX
  688.                MOV   DI,6
  689.                LEA   SI,id_boot
  690.                PUSH  CX                ; *
  691.                MOV   CX,id_boot_tam
  692.                REP   CMPSB
  693.                POP   CX                ; *
  694.                JE    haysb_ret         ; ZF = 1 -> 2M SuperBOOT
  695.                SUB   AX,64
  696.                LOOPNZ scan_boot        ; buscar 1K más abajo
  697. nohaysb_ret:   CMP   SP,0              ; ZF = 0 -> no es SuperBOOT
  698. haysb_ret:     POP   ES
  699.                RET
  700. SuperBOOT?     ENDP
  701.  
  702.               ENDIF
  703.  
  704.                ; --- Comprobar si la INT 40h está en uso
  705.  
  706. test_i40:      XPUSH <DS, ES>          ; *
  707.                MOV   AX,3540h
  708.                INT   21h
  709.                XPUSH <ES, BX>          ; vector de INT 40h original
  710.                LEA   DX,i40_aux
  711.                MOV   AX,2540h
  712.                INT   21h               ; establecer nueva INT 40h
  713.                XOR   AX,AX
  714.                MOV   DL,0
  715.                INT   13h               ; reset de disco
  716.                XPOP  <DX, DS>
  717.                MOV   AX,2540h
  718.                INT   21h               ; restaurar INT 40h original
  719.                XPOP  <ES, DS>          ; *
  720.                RET
  721.  
  722. i40_aux        PROC
  723.                OR    CS:accion,I40     ; sí utilizada INT 40h
  724.                IRET                    ; desde la INT 13h
  725. i40_aux        ENDP
  726.  
  727.                ; --- Detectar 286 ó superior.
  728.  
  729. testAT         PROC
  730.                PUSH  AX
  731.                PUSHF
  732.                POP   AX
  733.                OR    AH,70h        ; intentar activar bit 12, 13 ó 14
  734.                PUSH  AX            ; del registro de estado
  735.                POPF
  736.                PUSHF
  737.                POP   AX
  738.                AND   AH,0F0h
  739.                CMP   AH,0F0h
  740.                JE    testedAT
  741.                STC
  742. testedAT:      CMC                 ; CF = 0 en AT y 1 en PC/XT
  743.                POP   AX
  744.                RET
  745. testAT         ENDP
  746.  
  747. ; ------------ Comprobar que el buffer para el DMA en la copia
  748. ;              residente no cruza una frontera. En ese caso se emplea
  749. ;              otro buffer ubicado tras el habitual, lo que aumenta el
  750. ;              consumo de memoria de este área. A la entrada AX apunta
  751. ;              al segmento que contendrá el buffer y BX el offset. Si
  752. ;              no se produce el cruce, se disminuye «parrafos_resid»
  753. ;              para economizar memoria; incluso aunque se produzca,
  754. ;              esta variable se reduce en lo posible. A la vuelta,
  755. ;              «parrafos_resid» y BX indican la memoria definitiva
  756. ;              ocupada por el programa.
  757.  
  758. testDMA        PROC
  759.                XPUSH <AX, CX, DX>
  760.                MOV   CX,16
  761.                MUL   CX
  762.                ADD   AX,BX
  763.                ADC   DX,0              ; DX:AX = dirección 20 bits
  764.                MOV   CX,DX
  765.                PUSH  AX
  766.                ADD   AX,tbuffer-1      ; buffer para el mayor sector
  767.                ADC   DX,0
  768.                POP   AX
  769.                MOV   BX,parrafos_resid
  770.                SUB   BX,tbuffer/16     ; mejor supuesto posible
  771.                CMP   DX,CX
  772.                JE    dmatested
  773.                NEG   AX
  774.                ADD   AX,15
  775.                MOV   CL,4
  776.                SHR   AX,CL
  777.                ADD   BX,AX             ; consumo adicional
  778.                SHL   AX,CL
  779.                ADD   AX,OFFSET buffer_io
  780.                MOV   buffer,AX         ; nueva posición del buffer
  781.                OR    accion,BUFFERPLUS ; aviso al usuario
  782. dmatested:     MOV   parrafos_resid,BX
  783.                XPOP  <DX, CX, AX>
  784.                RET
  785. testDMA        ENDP
  786.  
  787. ; ------------ Desde Windows, no se permite instalar o desinstalar 2M.
  788.  
  789. testWin        PROC
  790.                PUSH  AX
  791.                CMP   param_w,ON        ; ¿se indicó parámetro /W?
  792.                JE    fin_testWin
  793.                MOV   AX,1600h
  794.                INT   2Fh
  795.                AND   AL,AL             ; ¿Windows en modo extendido?
  796.                JZ    noWinEnh
  797.                CMP   AL,80h            ; ¿Windows en modo extendido?
  798.                JE    noWinEnh
  799. siWin:         STC                     ; estamos dentro de Windows
  800.                JMP   fin_testWin
  801. noWinEnh:      MOV   AX,4680h
  802.                INT   2Fh
  803.                AND   AX,AX
  804.                JZ    siWin             ; Windows en modo real/estándar
  805. fin_testWin:   POP   AX
  806.                RET                     ; CF=1 si dentro de Windows
  807. testWin        ENDP
  808.  
  809. ; ------------ Calcular la constante de retardo básica para perder
  810. ;              exactamente 54,925 ms. Con una regla de 3 se podrá
  811. ;              después aplicar para hacer retardos de milisegundos.
  812.  
  813.               IFDEF  XT
  814.  
  815. cte_tiempos    PROC
  816.                XPUSH <DS, ES, BX, CX, DX>
  817.                MOV   AX,3508h
  818.                INT   21h
  819.                XPUSH <ES, BX>          ; preservar vector de INT 8
  820.                PUSH  DS
  821.                MOV   AX,40h
  822.                MOV   DS,AX
  823.                MOV   AL,DS:[6Ch]
  824. espera_i8:     CMP   AL,DS:[6Ch]
  825.                JE    espera_i8         ; esperar INT 8 ... para que no
  826.                POP   DS
  827.                LEA   DX,i8_crono       ; venga otra en un buen rato...
  828.                MOV   AX,2508h
  829.                INT   21h               ; nueva rutina de INT 8
  830.                IN    AL,21h
  831.                PUSH  AX                ; preservar estado de IRQ's
  832.                MOV   AL,11111110b
  833.                OUT   21h,AL            ; permitir sólo IRQ0
  834.                MOV   AH,0              ; fase
  835.                MOV   CX,0              ; contador
  836.                MOV   BX,CX             ; seguiría a 0 si fallara
  837.                EVEN                    ; forzar alineamiento
  838. cuenta_iter:   DEC   CX                ; <─┐ bucle básico de retardo
  839.                JMP   SHORT $+2         ;   │
  840.                JNZ   cuenta_iter       ; <─┘ lo interrumpirá INT 8
  841.                POP   AX                ; anterior estado de IRQ's
  842.                OUT   21h,AL
  843.                XPOP  <DX, DS>
  844.                PUSH  BX                ; valor real contado
  845.                MOV   AX,2508h          ; restaurar vector de INT 8
  846.                INT   21h
  847.                POP   AX                ; (65536-AX) vueltas en 54,9 ms
  848.                NEG   AX                ; constante de retardo básica
  849.                XPOP  <DX, CX, BX, ES, DS>
  850.                RET
  851. i8_crono:      INC   AH                ; nueva INT 8 que interrumpe
  852.                CMP   AH,1              ; el bucle de retardo
  853.                JE    fase1
  854.                CMP   AH,2
  855.                JE    fase2
  856. i8_exit:       MOV   AL,20h
  857.                OUT   20h,AL
  858.                IRET
  859. fase1:         MOV   CX,0              ; sincronizar con el reloj
  860.                JMP   i8_exit
  861. fase2:         MOV   BX,CX             ; anotar constante de retardo
  862.                MOV   CX,1              ; forzar fin del bucle
  863.                JMP   i8_exit
  864. cte_tiempos    ENDP
  865.  
  866.               ENDIF
  867.  
  868. ; ***********************************************
  869. ; *                                             *
  870. ; *   D A T O S    N O    R E S I D E N T E S   *
  871. ; *                                             *
  872. ; ***********************************************
  873.  
  874. ; ------------ Control de instalación.
  875.  
  876. offsets_ints   DW    2         ; número de vectores interceptados
  877. nueva_i13      DB    13h       ; tabla de offsets de los vectores
  878.                DW    ges_int13 ; de interrupción interceptados
  879.                DB    2Fh
  880.                DW    ges_int2F
  881.  
  882. ; ------------ Parámetros soportados
  883.  
  884. param_ml       DB    OFF       ; a ON si se indicó parámetro /ML
  885. param_u        DB    OFF       ; a ON si se indicó parámetro /U
  886. param_l        DB    OFF       ; a ON si se indicó parámetro /L
  887. param_w        DB    OFF       ; a ON si se indicó parámetro /W
  888. param_ayuda    DB    OFF       ; a ON si se indicó /? /H ó ?
  889.  
  890. parametros     LABEL BYTE
  891.  
  892.                DB    "?",0
  893.                DW    param_ayuda
  894.                DB    ON
  895.  
  896.                DB    "/?",0
  897.                DW    param_ayuda
  898.                DB    ON
  899.  
  900.                DB    "/H",0
  901.                DW    param_ayuda
  902.                DB    ON
  903.  
  904.                DB    "/U",0
  905.                DW    param_u
  906.                DB    ON
  907.  
  908.                DB    "/W",0
  909.                DW    param_w
  910.                DB    ON
  911.  
  912.                DB    "/ML",0
  913.                DW    param_ml
  914.                DB    ON
  915.  
  916.                DB    "/I",0
  917.                DW    param_i
  918.                DB    ON
  919.  
  920.                DB    "/L",0
  921.                DW    param_l
  922.                DB    ON
  923.  
  924.                DB    0                 ; fin de la tabla
  925.  
  926.  
  927. MALPC          EQU    1        ; Códigos de error
  928. MALDOS         EQU    2
  929. MALBIOS        EQU    4
  930. MALDRV         EQU    8
  931. ERRSINTAX      EQU   16
  932. NOINSTALADO    EQU   32
  933. IMPDESINS      EQU   64
  934. INSTALADOSYS   EQU  128
  935. HAY2MDOSINS    EQU  256
  936. HAY2MDOSDES    EQU  512
  937. NOINSTALABLE   EQU 1024
  938. MX64FULL       EQU 2048
  939. WIN_LOAD       EQU 4096
  940. WIN_UNLOAD     EQU 8192
  941.  
  942. INSTALADO      EQU   1         ; códigos de acción e información
  943. YAINSTALADO    EQU   2
  944. DESINSTALADO   EQU   4
  945. BUFFERPLUS     EQU   8
  946. I40            EQU  16
  947.  
  948. error          DW    0         ; variable para acumular errores
  949. accion         DB    0         ; variable que indica lo sucedido
  950.  
  951.               IFNDEF XT
  952. sbootseg       DW    0         ; segmento SuperBOOT (si presente)
  953.               ENDIF
  954.  
  955. id_2mdos       DB    "CiriSOFT:2MDOS:" ; marca de presencia de 2MDOS
  956. id_2mdos_tam   EQU   $-OFFSET id_2mdos
  957. id_boot        DB    "2M-STV"          ; marca de presencia SuperBOOT
  958. id_boot_tam    EQU   $-OFFSET id_boot
  959.  
  960. ; ------------ Texto.
  961.  
  962. programa_txt   DB    13,10,"  2M" XTX " 3.0",0
  963.  
  964. instalado_txt  DB    " instalado en ",255," installed on ",0
  965.  
  966.               IFNDEF XT
  967. ya_instal_txt  DB    " ya instalado en ",255
  968.                DB    " already installed on ",0
  969.               ELSE
  970. ya_instal_txt  DB    " reajustando base de tiempos; instalado en ",255
  971.                DB    " adjusting delay loop; already installed on ",0
  972.               ENDIF
  973.  
  974. tabla_ndrvs    DW    t12
  975.                DW    0
  976.                DW    t144
  977.                DW    t288
  978. t12            DB    ":1.2M ",0
  979. t144           DB    ":1.44M ",0
  980. t288           DB    ":2.88M ",0
  981.  
  982. nocabe_txt     DB    ": Instalación imposible.",13,10
  983.                DB    "      Ya hay 64 programas residentes con la "
  984.                DB    "misma técnica.",13,10,255
  985.                DB    ": Unable to install.",13,10
  986.                DB    "      There are already 64 TSR's with the same technique."
  987. crlf_txt       DB    13,10,0
  988.  
  989. err_sintax_txt DB    13,10,"    - Parámetro(s) incorrecto(s)."
  990.                DB    13,10,"      Ejecute 2M" XTX " /? para obtener "
  991.                DB    "ayuda.",13,10,7,255
  992.                DB    13,10,"    - Incorrect option(s)."
  993.                DB    13,10,"      Execute 2M" XTX " /? to obtain help."
  994.                DB    13,10,7,0
  995.  
  996.               IFNDEF XT
  997. mal_pc_txt     DB    13,10,"    - Error: Necesario ordenador AT. Utilice 2MX en esta máquina.",13,10,255
  998.                DB    13,10,"    - Error: Needs AT system. Use 2MX on this computer.",13,10,0
  999.               ELSE
  1000. mal_pc_txt     DB    13,10,"    - Error: Necesario ordenador PC/XT. Utilice 2M en esta máquina.",13,10,255
  1001.                DB    13,10,"    - Error: Needs PC/XT system. Use 2M on this computer.",13,10,0
  1002.               ENDIF
  1003.  
  1004. mal_dos_txt    DB    13,10,"    - Error: Necesaria versión DOS 3.30 ó posterior.",13,10,255
  1005.                DB    13,10,"    - Error: Needs at least DOS 3.30 or above.",13,10,0
  1006.  
  1007. mal_bios_txt   DB    13,10,"    - Error: No puedo detectar el tipo de las unidades. Instale 2M-?BIOS antes.",13,10,255
  1008.                DB    13,10,"    - Error: Impossible to detect drive types. Please install 2M-?BIOS before.",13,10,0
  1009.  
  1010. mal_drv_txt    DB    13,10,"    - Error: Necesaria(s) unidad(es) de alta densidad.",13,10,255
  1011.                DB    13,10,"    - Error: Needs high-density floppy drive(s).",13,10,0
  1012.  
  1013. dma_cross_txt  DB    "    - Nota: El buffer de E/S cruzaba una frontera de DMA y fue ampliado.",13,10
  1014.                DB    "            Cambie la ubicación en memoria de 2M" XTX " para ahorrar unos bytes.",13,10,255
  1015.                DB    "    - Note: I/O buffer has been extended because 2M" XTX " crosses a DMA boundary.",13,10
  1016.                DB    "            Modify the memory location of 2M" XTX " to save a little memory.",13,10,0
  1017.  
  1018. win_ld_txt     DB    " *NO* instalado:",13,10,"    Este programa debe cargarse ANTES de entrar en Windows.",13,10,7,255
  1019.                DB    " *NOT* installed:",13,10,"    This program must be loaded before WINDOWS.",13,10,7,0
  1020. win_ul_txt     DB    " *NO* desinstalado:",13,10,"    Este programa debe descargarse fuera de Windows.",13,10,7,255
  1021.                DB    " *NOT* uninstalled:",13,10,"    This program must be uninstalled outside of WINDOWS.",13,10,7,0
  1022.  
  1023. mal_ver_txt1   DB    13,10,"    - Error: ya está instalada la versión ",255
  1024.                DB    13,10,"    - Error: Version ",0
  1025. mal_ver_txt2   DB    " de este programa.",13,10,7,255
  1026.                DB    " of this program is already installed.",13,10,7,0
  1027.  
  1028. des_ok_txt     DB    " desinstalado.",13,10,255," uninstalled.",13,10,0
  1029.  
  1030. des_no_ok_txt  DB    13,10,"    - Desinstalación imposible (se ha "
  1031.                DB    "instalado después un programa"
  1032.                DB    13,10,"      que no respeta el convenio y tiene "
  1033.                DB    "alguna interrupción común).",13,10,7,255
  1034.                DB    13,10,"    - Uninstall unavailable (it has been"
  1035.                DB    " installed before a program that"
  1036.                DB    13,10,"      does not support CiriSOFT convention"
  1037.                DB    " and uses a common interrupt).",13,10,7,0
  1038.  
  1039. imp_desins_txt DB    13,10,"    - Programa aún no instalado: "
  1040.                DB    "imposible desinstalarlo.",13,10,255
  1041.                DB    13,10,"    - Program not installed: "
  1042.                DB    "impossible to uninstall.",13,10,0
  1043.  
  1044. inst_sys_txt   DB    13,10,"    - Instalado como controlador de dispositivo; no desinstalable.",13,10,255
  1045.                DB    13,10,"    - Installed as device driver: unable to uninstall.",13,10,0
  1046.  
  1047. inst_2mdos_txt DB    13,10,"    - Error: necesario instalar este programa *antes* que 2MDOS.",13,10,255
  1048.                DB    13,10,"    - Error: needed to install this program *before* 2MDOS.",13,10,0
  1049.  
  1050. dins_2mdos_txt DB    13,10,"    - Error: necesario desinstalar primero 2MDOS.",13,10,255
  1051.                DB    13,10,"    - Error: needed to uninstall first 2MDOS.",13,10,0
  1052.  
  1053.               IFNDEF XT
  1054.  
  1055. ayuda_txt      LABEL BYTE
  1056. DB 13,10,10
  1057. DB "    2M 3.0 - CONTROLADOR PARA ACCESO A DISCOS FORMATEADOS CON TECNOLOGIA STV.",13,10
  1058. DB "   (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática",13,10
  1059. DB "   C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8",13,10
  1060. DB 10
  1061. DB "                         Sintaxis:  2M [/ML] [/U] [/L]",13,10
  1062. DB 10
  1063. DB " ■ Tras ejecutarlo, 2M se queda residente en memoria, para dar soporte a discos",13,10
  1064. DB " de formato 2M creados por 2MF. 2M es una aplicación «CARDWARE». Esta permitida",13,10
  1065. DB " su distribución gratuíta SIN MODIFICACIONES.  Información sobre cómo conseguir",13,10
  1066. DB " el paquete completo e información de licencia con 2M /L.",13,10
  1067. DB 10
  1068. DB " ■ 2M precisa para operar:",13,10
  1069. DB " - Un equipo AT o superior con las disqueteras bien indicadas en el SETUP.",13,10
  1070. DB " - Al menos una disquetera de alta densidad (las de doble no son controladas).",13,10
  1071. DB " - 5168 bytes de memoria superior o en su defecto 5264 de memoria convencional.",13,10
  1072. DB " - Sistema operativo DOS y/o WINDOWS 3.X, otros entornos no son contemplados.",13,10
  1073. DB " - Utilidad 2MF para formatear los disquetes 2M.",13,10
  1074. DB " ■ 2M ofrece:",13,10
  1075. DB " - Soporte para disquetes de 902K (5¼-DD) hasta 3772K (3½-ED) en A: y en B:.",13,10
  1076. DB " - Soporte INT 13h para que los programas comerciales puedan formatear en 2M.",13,10
  1077. DB 10
  1078. DB " ■ Con /ML se fuerza la instalación en memoria convencional (2M se auto-instala",13,10
  1079. DB " automáticamente en memoria superior) y con /U se desinstala, si es posible.",13,10
  1080. DB 255
  1081.  
  1082. DB 13,10,10
  1083. DB "     2M 3.0  -  DISKETTE DRIVE CONTROLLER FOR STV DISKETTE FORMAT TECHNOLOGY.",13,10
  1084. DB "   (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática.",13,10
  1085. DB "    C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8",13,10
  1086. DB 10
  1087. DB "                          Syntax:  2M [/ML] [/U] [/L]",13,10
  1088. DB 10
  1089. DB " ■ After being executed without options, the program becomes resident in memory",13,10
  1090. DB " to support 2M disks built by 2MF. 2M is a «CARDWARE» package. The distribution",13,10
  1091. DB " is only authorized WITHOUT MODIFY. How to get the complete package and license",13,10
  1092. DB " information with 2M /L.",13,10
  1093. DB 10
  1094. DB " ■ 2M requires:",13,10
  1095. DB " - An AT or above computer with diskette drives correctly set on SETUP.",13,10
  1096. DB " - At least one high-density floppy drive (double ones are not drived).",13,10
  1097. DB " - 5168 bytes of upper memory or 5264 bytes of conventional memory instead.",13,10
  1098. DB " - DOS and/or WINDOWS 3.X system, another environs are not still supported.",13,10
  1099. DB " - 2MF utility program to format 2M diskettes.",13,10
  1100. DB " ■ 2M gives you:",13,10
  1101. DB " - Support for diskettes from 902K (5¼-DD) up to 3772K (3½-ED) on A: and B:.",13,10
  1102. DB " - INT 13h code improves a new 2M format service for high-level applications.",13,10
  1103. DB 10
  1104. DB " ■ With /ML a conventional memory installation can be forced  (this is an upper",13,10
  1105. DB " memory self-installating utility) and /U tells 2M to uninstall, if possible.",13,10
  1106. DB 0
  1107.  
  1108.               ELSE
  1109.  
  1110. ayuda_txt      LABEL BYTE
  1111. DB 13,10,10
  1112. DB "   2MX 3.0 - CONTROLADOR PARA ACCESO A DISCOS FORMATEADOS CON TECNOLOGIA STV.",13,10
  1113. DB "   (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática",13,10
  1114. DB "   C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8",13,10
  1115. DB 10
  1116. DB "                         Sintaxis:  2MX [/ML] [/U] [/L]",13,10
  1117. DB 10
  1118. DB " ■ Tras ejecutarlo, 2MX se queda residente en memoria para dar soporte a discos",13,10
  1119. DB " de formato 2M creados por 2MF. 2M es una aplicación «CARDWARE». Esta permitida",13,10
  1120. DB " su distribución gratuíta SIN MODIFICACIONES.  Información sobre cómo conseguir",13,10
  1121. DB " el paquete completo e información de licencia con 2MX /L.",13,10
  1122. DB 10
  1123. DB " ■ 2MX precisa para operar:",13,10
  1124. DB " - Un equipo PC/XT con una BIOS moderna (o 2M-XBIOS instalado en su defecto).",13,10
  1125. DB " - Al menos una disquetera de alta densidad (las de doble no son controladas).",13,10
  1126. DB " - 5376 bytes de memoria superior o en su defecto 5472 de memoria convencional.",13,10
  1127. DB " - Sistema operativo DOS y/o WINDOWS 3.X, otros entornos no son contemplados.",13,10
  1128. DB " - Utilidad 2MF para formatear los disquetes 2M.",13,10
  1129. DB " ■ 2MX ofrece:",13,10
  1130. DB " - Soporte para disquetes de 902K (5¼-DD) hasta 3772K (3½-ED) en A: y en B:.",13,10
  1131. DB " - Soporte INT 13h para que los programas comerciales puedan formatear en 2M.",13,10
  1132. DB 10
  1133. DB " ■ Con /ML se fuerza la instalación en memoria convencional (2MX se autoinstala",13,10
  1134. DB " automáticamente en memoria superior) y con /U se desinstala, si es posible.",13,10
  1135. DB 255
  1136.  
  1137. DB 13,10,10
  1138. DB "    2MX 3.0  -  DISKETTE DRIVE CONTROLLER FOR STV DISKETTE FORMAT TECHNOLOGY.",13,10
  1139. DB "   (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática.",13,10
  1140. DB "    C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8",13,10
  1141. DB 10
  1142. DB "                          Syntax:  2MX [/ML] [/U] [/L]",13,10
  1143. DB 10
  1144. DB " ■ After being executed without options, the program becomes resident in memory",13,10
  1145. DB " to support 2M disks built by 2MF. 2M is a «CARDWARE» package. The distribution",13,10
  1146. DB " is only authorized WITHOUT MODIFY. How to get the complete package and license",13,10
  1147. DB " information with 2MX /L.",13,10
  1148. DB 10
  1149. DB " ■ 2MX requires:",13,10
  1150. DB " - A PC/XT computer with a modern BIOS (or with 2M-XBIOS installed instead).",13,10
  1151. DB " - At least one high-density floppy drive (double ones are not drived).",13,10
  1152. DB " - 5376 bytes of upper memory or 5472 bytes of conventional memory instead.",13,10
  1153. DB " - DOS and/or WINDOWS 3.X system, another environs are not still supported.",13,10
  1154. DB " - 2MF utility program to format 2M diskettes.",13,10
  1155. DB " ■ 2MX gives you:",13,10
  1156. DB " - Support for diskettes from 902K (5¼-DD) up to 3772K (3½-ED) on A: and B:.",13,10
  1157. DB " - INT 13h code improves a new 2M format service for high-level applications.",13,10
  1158. DB 10
  1159. DB " ■ With /ML a conventional memory installation can be forced  (this is an upper",13,10
  1160. DB " memory self-installating utility) and /U tells 2MX to uninstall, if possible.",13,10
  1161. DB 0
  1162.               ENDIF
  1163.  
  1164. infop_txt      LABEL BYTE
  1165. DB 13,10
  1166. DB 10
  1167. DB "──────────────── LICENCIA DE USO Y CONDICIONES DE DISTRIBUCION ────────────────",13,10
  1168. DB "  Es legal copiar 2M sin cobrar dinero (a lo sumo los costes de distribución) a",13,10
  1169. DB "cualquier otra persona. Quien decida utilizar algún programa del paquete 2M con",13,10
  1170. DB "la excepción de 2M.COM y 2MX.COM deberá enviarme una postal. Para utilizar sólo",13,10
  1171. DB "2M.COM o 2MX.COM no es obligatorio enviar la postal (sólo es opcional),  ya que",13,10
  1172. DB "dichos programas así como el formato de disco 2M,  su  sector  de arranque y el",13,10
  1173. DB "código SuperBOOT son de dominio público.  Esto  permite  a las empresas incluir",13,10
  1174. DB "sólo 2M.COM o 2MX.COM en sus distribuciones  de productos  en  discos  2M,  sin",13,10
  1175. DB "que sus clientes tengan la obligación de enviarme la postal. Aunque me gustaría",13,10
  1176. DB "que incluyeran también el fichero original (2M30.ZIP) si les sobra espacio.",13,10
  1177. DB 10
  1178. DB "  ESTA PROHIBIDO  modificar  este  programa o cualquier otro del paquete sin mi",13,10
  1179. DB "consentimiento. En caso de distribuir algún fichero que no sea 2M.COM ó 2MX.COM",13,10
  1180. DB "será obligatorio distribuir el paquete 2M completo.",13,10
  1181. DB 10
  1182. DB "  Si usted no dispone del paquete 2M completo, puede conseguirlo en Internet en",13,10
  1183. DB "ftp.gui.uva.es (pub/pc/2m), oak.oakland.edu (SymTel/msdos/diskutil) así como en",13,10
  1184. DB "garbo.uwasa.fi (pc/format);  por teléfono en la BBS DataByte  (+34 -83 -307574:",13,10
  1185. DB "00-24h, 1200-28800, Grupo Varios, Area de Ficheros del GUI y Login:).  Ventajas",13,10
  1186. DB "del paquete completo:  más ayuda (2M-INFO),  formateador (2MF),  optimizador de",13,10
  1187. DB "formateo de discos estándar (2MDOS), discos de más capacidad (2MGUI: 3½ ->1176,",13,10
  1188. DB "1972, 3944  y  5¼ -> 976, 1639),  actualización BIOS (2M-ABIOS y 2M-XBIOS).  La",13,10
  1189. DB "licencia de uso para el paquete completo consiste en enviar una tarjeta postal.",13,10
  1190.  
  1191. DB 255
  1192.  
  1193. DB 13,10
  1194. DB 10
  1195. DB "─────────────────── USE LICENSE AND DISTRIBUTION CONDITIONS ───────────────────",13,10
  1196. DB "  It is legal to copy 2M without charge (or charging a little distribution fee)",13,10
  1197. DB "for anyone. Whoever who decides to use a program from 2M package, except 2M.COM",13,10
  1198. DB "and 2MX.COM must send me a postcard.  To use only 2M.COM or 2MX.COM it isn't an",13,10
  1199. DB "obligation to send the postcard  (it's only optional),  since this program  and",13,10
  1200. DB "2M disk formats, their boot records and SuperBOOT code are public domain.  This",13,10
  1201. DB "permits any company to include only 2M.COM  and/or  2MX.COM in his own products",13,10
  1202. DB "distributed on 2M disks,  without having their customers the obligation on send",13,10
  1203. DB "me the postcard. But I would like them to include the original file  (2M30.ZIP)",13,10
  1204. DB "if they have any remaining free space on their disk(s).",13,10
  1205. DB 10
  1206. DB "  IT IS FORBIDDEN  to  modify this program or any other included in the package",13,10
  1207. DB "without my permission.  If any file except 2M.COM or 2MX.COM is distributed, it",13,10
  1208. DB "is also obligatory to include the complete 2M package.",13,10
  1209. DB 10
  1210. DB "  If you  still  haven't  got  the complete 2M package, you  can  get it on the",13,10
  1211. DB "Internet at ftp.gui.uva.es (pub/pc/2m), oak.oakland.edu (SymTel/msdos/diskutil)",13,10
  1212. DB "or garbo.uwasa.fi (pc/format); by telephone on  DataByte BBS  (+34 -83 -307574:",13,10
  1213. DB '00-24h, 1200-28800, Group Varios, "Area de Ficheros del GUI y Login:"). Benefit',13,10
  1214. DB "of complete package: more help (2M-INFO), disk formatter (2MF),  standard disks",13,10
  1215. DB "format optimizer (2MDOS), more capacity disks (2MGUI: 3½ ->1176, 1972, 3944 and",13,10
  1216. DB "5¼ -> 976, 1639),  disk BIOS update (2M-ABIOS and 2M-XBIOS).  The  use  licence",13,10
  1217. DB "for the complete package consist of sending me a postcard.",13,10
  1218. DB 0
  1219.  
  1220. buffer_aux     DB    64 DUP (0)   ; buffer para alguna función del DOS
  1221.  
  1222. _PRINCIPAL     ENDS
  1223.                END   inicio
  1224.